package com.example.backend.service;

import com.example.backend.entity.Company;
import com.example.backend.entity.Port;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

@Service
public class PortRuleCalculationService {
    
    @Autowired
    private CompanyService companyService;
    
    @Autowired
    private PortService portService;
    
    /**
     * 获取有效的港口规则
     * 优先级：公司规则 > 港口默认规则
     * 
     * @param companyId 公司ID
     * @param portId 港口ID
     * @return 规则信息 [免费天数, 费率]
     */
    public Object[] getEffectiveRule(Long companyId, Long portId) {
        // 先检查公司是否有自定义规则
        Company company = companyService.getCompanyById(companyId);
        if (company != null && company.getFreeDays() != null && company.getFeeRate() != null) {
            // 使用公司规则
            return new Object[]{
                company.getFreeDays(),
                BigDecimal.valueOf(company.getFeeRate())
            };
        }
        
        // 如果没有公司规则，使用港口默认规则
        Port port = portService.getPortById(portId);
        if (port != null && port.getFreeDays() != null && port.getFeeRate() != null) {
            return new Object[]{
                port.getFreeDays(),
                port.getFeeRate()
            };
        }
        
        // 如果都没有设置，返回默认值
        return new Object[]{0, BigDecimal.ZERO};
    }
    
    /**
     * 计算存储费用
     * 
     * @param companyId 公司ID
     * @param portId 港口ID
     * @param weight 重量（吨）
     * @param days 存储天数
     * @return 存储费用
     */
    public BigDecimal calculateStorageFee(Long companyId, Long portId, BigDecimal weight, int days) {
        Object[] rule = getEffectiveRule(companyId, portId);
        Integer freeDays = (Integer) rule[0];
        BigDecimal feeRate = (BigDecimal) rule[1];
        
        // 计算超出免费天数的天数
        int chargeableDays = Math.max(0, days - freeDays);
        
        // 计算费用：重量 * 费率 * 收费天数
        return weight.multiply(feeRate).multiply(BigDecimal.valueOf(chargeableDays));
    }
    
    /**
     * 计算存储费用（直接传入免费天数和费率）
     */
    public BigDecimal calculateStorageFee(BigDecimal weight, int days, int freeDays, BigDecimal feeRate) {
        int chargeableDays = Math.max(0, days - freeDays);
        return weight.multiply(feeRate).multiply(BigDecimal.valueOf(chargeableDays));
    }
} 